#ifndef CAMERA1_H
#define CAMERA1_H

#include "../common/head.h"
#include "ui_visual2.h"

//该线程用于读取摄像头数据并处理图像
//有以下几种处理模式
//状态0：未运行状态，仅在主界面显示摄像头画面不做处理
//状态1：运行状态，主界面显示摄像头画面并在图像上框选出识别出的模板位置，同时将其转换为世界坐标并发送给PLC
//状态2：完成标注状态，在主界面上显示框选出的模板图像
//状态3：标注模板状态，在主界面上显示静止的一帧图像，用户可用鼠标在上面框选矩形区域作为模板，显示用户框选的矩形区域
//状态4：棋盘格标定状态（未运行），主界面上实时显示识别到的棋盘格格点
//状态5：正在标定状态，固定图像并显示格点和连线，同时显示标定结果
//状态6：手动PLC控制状态，固定图像并显示十字准星
//状态变量存储于Paras::Work_state中
class camera1:public QThread
{
    Q_OBJECT
public:
    static camera1* getInstance();
    ~camera1();
    explicit camera1(QObject *parent = nullptr);

protected:
    void run();

private:
    static QScopedPointer<camera1> self;
    QMutex mutex;
    volatile bool stopped;

    int localIntervals;
    bool detectFlag;
    bool sendInfoFlag;
    bool newFrameFlag;

    cv::Point2d center;
    float rotateAngle;

    cv::Mat fixedframe;
    cv::Mat frame;
    cv::Mat templateImage;
    double min_score;
    int temp_count=0;
signals:
    void sendImage();
    void sendPos(cv::Point2d center, float rotateAngle);

private:
    void initThread();
    void DoThread();
    void SendResult();
    void saveImage(cv::Mat image);

public slots:
    void stopThread();
    void setLocalIntervals(int intervals);
    void setDetectFlag(bool flag);
    void setSendInfoFlag(bool flag);
    void setTemplateImage(QString path);
    void process();
};

#endif // CAMERA1_H